#pragma once
#include <Rz/Types.h>

namespace Rz { namespace Math {

// constants
static const f64 Pi					= 3.1415926535897932384626433832795;
static const f64 DegreesInRadian	= Pi / 180.0;
static const f64 RadiansInDegree	= 180.0 / Pi;

// templates
template <typename T>
RZ_INLINE static auto Min(T n1, T n2) -> decltype(n1 + n2)
{
	return (n1 < n2 ? n1 : n2);
}

template <typename T>
RZ_INLINE static auto Max(T n1, T n2) -> decltype(n1 + n2)
{
	return (n1 > n2 ? n1 : n2);
}

f32 DegToRad(f32 deg);
f32 RadToDeg(f32 rad);

// f32
f32 Sin(f32 x);
f32 Cos(f32 x);
f32 Tan(f32 x);
f32 Cotg(f32 x);
f32 Sqrt(f32 x);
f32 Exp(f32 x);
f32 Log2(f32 x);
f32 Pow(f32 x, f32 y);
s32 IFloor(f32 x);

// f64
f64 Sin(f64 x);
f64 Cos(f64 x);
f64 Tan(f64 x);
f64 Cotg(f64 x);		
f64 Sqrt(f64 x);		
f64 Exp(f64 x);		
f64 Log2(f64 x);		
f64 Pow(f64 x, f64 y);
s64 IFloor(f64 x);	

// random
f32 Random(u32* seed);

} }
